# Copyright (C) 2013 MongoDB Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'json'

# test framework for C extension versus pure Ruby
# (consider ENV for C versus C)
DEFAULT_TARGET = 'test_ext_rb_float_to_bson'
NON_ZERO_TIME = 0.0000000001 # 10^-10

def sh_eval(command)
  puts command
  text = `#{command}`
  lines = text.split("\n")
  ruby_on = lines.grep(/^[^.#\w]/).first
  if lines.grep(/Error/).first
    print text
    raise "sh_eval error"
  elsif ruby_on
    eval lines.grep(/^[^.#\w]/).first
  else
    raise "no Ruby data - check the TARGET"
  end
end

def hash_f(hash, precision)
   hash.each_pair do |key, value|
     hash[key] = "%.#{precision}f" % value if value.kind_of?(Float)
   end
end

def print_gain(measurement)
  measurement = measurement.collect do |h|
    h[:allocated] = h[:allocated] / h[:count]
    h[:label] = "\"#{h[:label]}\""
    h.select{|k,v| [:label, :utime, :real, :allocated].include?(k)}
  end
  gain = 1.0 - measurement[1][:utime]/(measurement[0][:utime] + NON_ZERO_TIME)
  measurement.each do |t|
    puts hash_f(t, 1).each_pair.collect{|key, value| "#{key}: #{value}" }.join(', ')
  end
  puts "gain: #{'%.2f' % gain}"
end

$measurement = []

task :default do
  TARGET = ENV['TARGET'] || DEFAULT_TARGET
  $measurement = []
  [:clean, :compile].each do |t|
    Rake::Task[t].execute
    Rake::Task[:test].execute
  end
  print_gain($measurement)
end

task :clean do
  sh "(cd .. && rake clean)"
end

task :compile do
  sh "(cd .. && rake compile)"
end

task :test do
  $measurement << sh_eval("ruby bench_test.rb --name #{TARGET}")
end
